package com.zjl.redis.第18章_五大数据类型和源码解析;

/**
 * Redis 的源码分析 是c语言写的
 * 可以用 VS code
 *
 * Java是一切皆对象，
 * Redis 是一切皆 KV
 *
 * redis6相关的底层模型和结构
 *      string = SDS
 *      Set = intset + hashtable
 *      ZSet = skiplist + ziplist
 *      List = quicklist + zipList
 *      Hash = hashtable + ziplist
 *      ======================================================
 * redis7相关的底层模型和结构
 *      string = SDS
 *      Set = intset + hashtable
 *      ZSet = skiplist + listpack
 *      List = quicklist
 *      Hash = hashtable + listpack
 *
 * ------------------------------------------------------------------------
 * 每个键值对都会有一个dictEntry
 * set k1 v1 为例， 执行 object encoding k1   返回 "embstr"
 * set k2 10 为例， 执行 object encoding k2   返回 "int"    //如果 值太大（超出long范围），又会成为 "embstr"
 *
 * 因为Redis是KV键值对的数据库，每个键值对都会有一个dictEntry(源码位置: dict.h),
 * 里面指向了key和value的指针，next 指向下一个dictEntry。
 * key是字符串，但是Redis没有直接使用C的字符数组，而是存储在redis自定义的SDS中。
 *
 * value既不是直接作为字符串存储，也不是直接存储在SDS中，而是存储在 redisObject 中。
 * 实际上五种常用的数据类型的任何一种，都是通过redisObject来存储的。
 *
 * RedisObject：
 * type:4           当前值对象的数据类型
 * encoding:4       当前值对象底层存储的编码类型
 * Lru:LRU bits     十采用LRU算法清除内存中的对象  *24位，对象最后一次被命令程序访问的时间，与内存回收有关
 * int refcount     记录对象引用次数
 * void *ptr        指向真正的底层数据结构的指针
 *
 *
 * 开启  enable-debug-command local # 默认no 关闭debug 模式    local  开启
 * 初始  set k1 100000000
 * 执行  debug object k1  #必许开启
 * 返回  Value at:0x7f6c33cce110
 *      refcount:1
 *      encoding:int
 *      serializedlength:5
 *      lru:9651668
 *      lru_seconds_idle:13
 *
 * 每个类还会存储数据类型
 *  缓存过期淘汰策略模式
 *
 * 在 redis中的 string类型中
 * RedisObject内部对应3大物理编码
 *      int     #如果 值太大（超出long [-9223372036854775808,9223372036854775807]范围），又会成为 "embstr"
 *      embstr  #浮点数也会保存成此类型  小于等于 44 字节字符串
 *      raw     #大于于 44 字节字符串
 */
public class A_基础源码类型 {
}
